import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue' 
import vueJsx from '@vitejs/plugin-vue-jsx';
import { svgBuilder } from './src/plugins/svgBuilder';

import path, { resolve } from 'path' 
import legacy from '@vitejs/plugin-legacy' 
import { loadEnv } from 'vite'
import viteCompression from 'vite-plugin-compression'
//直接获取文件的text
function rawTransform(
  fileRegex: Array<RegExp>,
): {
  name: string;
  transform: (src: string, id: string) => string | void;
} {
  return {
    name: 'get-file-raw',
    transform(src, id): string | void {
      if (fileRegex.filter((re) => re.test(id)).length > 0) {
        return `export default ${JSON.stringify(src)}`;
      }
    },
  };
}

// https://vitejs.dev/config/
export default defineConfig({
  publicDir: 'public',
  optimizeDeps: {
    //声明深度路径模块
    include: [
      'bpmn-js/lib/Modeler',
      'highlight.js',
      'codemirror',
      'codemirror/mode/xml/xml.js',
      'codemirror/addon/hint/xml-hint.js',
      'bpmn-js/lib/features/label-editing/LabelUtil.js',
      'element-plus/lib/locale/lang/zh-cn',
       'bpmn-js/lib/Modeler',
       'bpmn-js-token-simulation'
    ],
  },
  plugins: [
    vue(), 
    rawTransform([/\.bpmn$/]), 
    vueJsx({}),
    svgBuilder('./src/icons/svg/'),
    legacy({
      targets: ['ie >= 11'],
      additionalLegacyPolyfills: ['regenerator-runtime/runtime']
    }),
    viteCompression()
  ],
  resolve: {
    alias: {
      '~': resolve(__dirname, './'),
      '@': resolve(__dirname, 'src'),
      'src': resolve(__dirname, 'src')
    },
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue', '.mjs']
},
css: {
    preprocessorOptions: {
        less: {
            modifyVars: {
                'primary-color': '#1890ff',
                'link-color': '#1890ff',
                'border-radius-base': '4px'
            },
            javascriptEnabled: true
        }
    },
     // css sass  charset 报错
    postcss: {
      plugins: [
          {
            postcssPlugin: 'internal:charset-removal',
            AtRule: {
              charset: (atRule) => {
                if (atRule.name === 'charset') {
                  atRule.remove();
                }
              }
            }
          }
      ],
    }
},
build: {
  // 浏览器兼容性 ‘esnext’ | 'modules'

  target: 'modules',
  //输出路径
  // outDir: '../dist',
  // // 生成静态资源的存放路径
  // assetsDir: '../assets',
  // 小于此阈值的导入或引用资源将内联为 base64 编码， 以避免额外的http请求， 设置为 0, 可以完全禁用此项，
  assetsInlineLimit: 4096,
  // 启动 / 禁用 CSS 代码拆分
  cssCodeSplit: true,
  // 构建后是否生成 soutrce map 文件
  sourcemap: false,
  // 自定义底层的 Rollup 打包配置
  rollupOptions: {
    input: { 
      bpmn: path.resolve(__dirname, 'src/bpmn.html'),
      index: path.resolve(__dirname, 'src/index.html'),
    },
    output: {
      chunkFileNames: 'static/js/[name]-[hash].js',
      entryFileNames: 'static/js/[name]-[hash].js',
      assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
    }
  },

  // @rollup/plugin-commonjs 插件的选项
  commonjsOptions: {},

  // 构建的库
  // lib: { entry: string, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string },

  // 当设置为 true, 构建后将会生成 manifest.json 文件
  manifest: false,

  // 设置为 false 可以禁用最小化混淆
  // 或是用来指定是应用哪种混淆器
  // boolean | 'terser' | 'esbuild'
  minify: 'terser',

  // 传递给 Terser 的更多 minify 选项
  terserOptions: {},

  // 设置为false 来禁用将构建好的文件写入磁盘
  write: true,

  // 默认情况下 若 outDir 在 root 目录下， 则 Vite 会在构建时清空该目录。
  emptyOutDir: true,

  // 启用 / 禁用 brotli 压缩大小报告
  brotliSize: false,

  // chunk 大小警告的限制
  chunkSizeWarningLimit: 500
} ,
server: {
  open: true,
    proxy: {
        // 选项写法
        '/api': { 
            target: 'http://localhost:8000', // 本地 
            //  rewrite: path => path.replace(/^\/api/, ''), // 重写传过来的path路径，比如 `/api/index/1?id=10&name=zs`（注意:path路径最前面有斜杠（/），因此，正则匹配的时候不要忘了是斜杠（/）开头的；选项的 key 也是斜杠（/）开头的）
            changeOrigin: true // true/false, Default: false - changes the origin of the host header to the target URL
        }
    }
}
})
